/**
 * 对应接口文档地址 http://mp.weixin.qq.com/wiki/17/304c1885ea66dbedf7dc170d84999a9d.html
 */
package com.viewhigh.wechat.sdk.api;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.lang3.StringUtils;
import org.sword.lang.HttpUtils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.viewhigh.framework.common.log.LogUtils;
import com.viewhigh.framework.util.JacksonUtils;
import com.viewhigh.wechat.sdk.base.BaseApi;
import com.viewhigh.wechat.sdk.cache.TemplateCache;
import com.viewhigh.wechat.sdk.message.template.TemplateMsg;
import com.viewhigh.wechat.sdk.message.template.TemplateMsgBody;
import com.viewhigh.wechat.sdk.message.template.TemplateMsgData;

/**
 * 
 * @ClassName: TemplateMsg
 * @Description: 模板消息API
 * @author liusongqing
 * @date 2016年9月23日 下午11:08:44
 *
 */
public class TemplateMsgApi extends BaseApi {
    // 设置所属行业接口地址
    public static final String SET_INDUSTRY_URL = "https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token=";
    // 添加模板id接口地址
    public static final String GET_TEMPLATE_ID_URL = "https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token=";
    // 发送模板消息接口地址
    public static final String SEND_MSG_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=";
    // 获取模板消息列表
    public static final String GET_ALL_MSG_URL = "https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token=";


    /**
     * 设置所属行业 接口说明中没有给出
     */
    public static void setIndustry(String appId, String... industrys) {
        String url = SET_INDUSTRY_URL + getAccessTokenStr(appId);
        JSONObject json = new JSONObject();
        for (int i = 0; i < industrys.length; i++) {
            json.put("industry_id" + i, industrys[i]);
        }
        String data = json.toJSONString();
        HttpUtils.post(url, data);
    }

    /**
     * 获得模板ID
     * 
     * @param templateIdShort template_id_short
     * @return template_id
     */
    public static String getTemplateId(String templateIdShort, String appId) {
        LogUtils.debugLog("get template id,short template id is:" + templateIdShort);
        // 构造请求数据
        String url = GET_TEMPLATE_ID_URL + getAccessTokenStr(appId);
        JSONObject json = new JSONObject();
        json.put("template_id_short", templateIdShort);
        String data = json.toJSONString();
        String result = HttpUtils.post(url, data);
        LogUtils.debugLog("post result:" + result);
        // 解析请求数据
        JSONObject resultJson = JSONObject.parseObject(result);
        if (resultJson.getString("errcode").equals("0"))
            return resultJson.getString("template_id");
        LogUtils.debugLog("get template id error:" + resultJson.getString("errmsg"));
        return null;
    }


    /**
     * 发送模板消息
     */
    public static String send(TemplateMsgBody postData, String appId) {
        
        LogUtils.error("进入sdk，发送消息，参数appId为:" + appId);
        System.out.println("--**--进入sdk，发送消息，参数appId为:" + appId);
        
        // 构造请求数据
        String url = SEND_MSG_URL + getAccessTokenStr(appId);
        
        LogUtils.error("url为:" + url);
        System.out.println("--**--url为:" + url);
        
        JSONObject json = new JSONObject();
        json.put("touser", postData.getTouser());
        json.put("template_id", postData.getTemplateId());
        json.put("url", postData.getUrl());
        json.put("topcolor", postData.getTopcolor());

        LogUtils.error("json为:" + json.toJSONString());
        System.out.println("--**--json为:" + json.toJSONString());

        JSONObject jsonData = new JSONObject();
        for (TemplateMsgData data : postData.getData()) {
            JSONObject keynote = new JSONObject();
            keynote.put("value", data.getValue());
            keynote.put("color", data.getColor());
            jsonData.put(data.getName(), keynote);
        }
        json.put("data", jsonData);

        LogUtils.error("json加入模版信息为:" + json.toJSONString());
        System.out.println("--**--json加入模版信息为:" + json.toJSONString());

        String data = json.toJSONString();
        
        String result = HttpUtils.post(url, data);
        // 发送失败 重新返回队列重试，直到成功为止
        if(StringUtils.isBlank(result)){
            LogUtils.error("HttpUtils.post：请求异常，返回值为null");
            return "-1";
        }        
        LogUtils.error("HttpUtils.post返回值为：" + result);
        System.out.println("--**--HttpUtils.post返回值为：" + result);
        
        // 解析请求数据
        JSONObject resultJson = JSONObject.parseObject(result);

        LogUtils.error("解析resultJson成功");
        System.out.println("--**--解析resultJson成功");

        if (resultJson != null) {
            if (org.apache.commons.lang.StringUtils.isNotBlank(resultJson.getString("errcode"))) {
                String errcode = resultJson.getString("errcode");
                if ("0".equals(errcode)) {
                    LogUtils.error("发送成功：msgID" + resultJson.getString("msgid"));
                    System.out.println("--**--发送成功：msgID" + resultJson.getString("msgid"));
                    return "0";
                } else if("43004".equals(errcode)){//需要接收者关注
                    LogUtils.error("****发送失败,不重试****需要接收者关注：msgID" + resultJson.getString("msgid"));
                    System.out.println("--**--发送失败,不重试****需要接收者关注：msgID" + resultJson.getString("msgid"));
                    return "0";
                }else{
                    LogUtils.error("发送失败：" + resultJson.getString("errmsg"));
                    System.out.println("--**--发送失败：" + resultJson.getString("errmsg"));
                    return "-1";
                }
            }
        }

        LogUtils.error("send template message error: resultJson为null");
        System.out.println("--**--send template message error: resultJson为null");
        return null;
    }

    public static List<TemplateMsg> getAllTemplateMsg(String appId) {
        List<TemplateMsg> list = new ArrayList<TemplateMsg>();
        // 构造请求数据

        String jsonStr = TemplateCache.get(appId);
        if (org.apache.commons.lang.StringUtils.isNotBlank(jsonStr)) {
            try {
                return (List<TemplateMsg>) JSONArray.parseArray(jsonStr, TemplateMsg.class);
            } catch (Exception e) {
                LogUtils.error("从redis中获取templateIds失败", e);
            }
        }
        String url = GET_ALL_MSG_URL + getAccessTokenStr(appId);
        HttpMethod method = new PostMethod(url);
        HttpClient httpclient = new HttpClient();
        String result = "";
        try {
            httpclient.executeMethod(method);
            result = new String(method.getResponseBody(), "utf-8");
        } catch (Exception e1) {
            e1.printStackTrace();
            LogUtils.error("获取模板消息列表异常:" + e1.getMessage(), e1);
        } finally {
            if (StringUtils.isBlank(result))
                return null;
        }
        LogUtils.serviceLog("get result:" + result);
        // 解析请求数据
        JSONObject resultJson = JSONObject.parseObject(result);
        if (null != resultJson) {
            Object listStr = resultJson.get("template_list");
            JSONArray array = JSONArray.parseArray(listStr.toString());
            if (null != array && array.size() > 0) {
                for (int i = 0; i < array.size(); i++) {
                    JSONObject msgJson = array.getJSONObject(i);
                    TemplateMsg msg = new TemplateMsg();
                    msg.setTemplateId(msgJson.getString("template_id"));
                    msg.setTitle(msgJson.getString("title"));
                    list.add(msg);
                }
            } else {
                LogUtils.error("get all templateMsg error: TemplateMsgList is null!");
            }
        }

        TemplateCache.set(appId, JacksonUtils.toJson(list));

        return list;

    }
}
